import groovy.util.Eval
import grails.converters.JSON;
import org.codehaus.groovy.grails.commons.ApplicationHolder as AH



class GridTagLib {

    def grailsApplication
    def context = AH.application.mainContext

    static namespace = "is"

    public static final String TYPE_DATE     = "date"
    public static final String TYPE_INTEGER  = "integer"
    public static final String TYPE_DECIMAL  = "decimal"
    public static final String TYPE_TEXT     = "text"
    public static final String TYPE_BOOLEAN  = "boolean"

    public static final String ENTRY_QUERY   = "query"
    public static final String ENTRY_LIST    = "list"
    public static final String ENTRY_CLASS   = "class"

    public static final String SORT_ASC    = "asc"
    public static final String SORT_DESC   = "dec"

    def grid = {attributes, body ->

        //Buscando a lista de colunas
        def cols = getCols(body)
        
        //Buscando o resultado
        def resultList = getResult(attributes)
        println "resultList = "+resultList


        out << render(template:"/template/gridTag", model:[
                "resultList":resultList,
                "cols":cols
        ])

    }

    /**
     * Faz a busca dos dados de acordo com a fonte de dados escolhida
     */
    private def getResult(def attributes){

        def result
        def query

        if(attributes[ENTRY_LIST]){
            result = attributes[ENTRY_LIST]

        }else if(attributes[ENTRY_QUERY]){

            query = attributes[ENTRY_QUERY]

        }else if(attributes[ENTRY_CLASS]){
            def clazz = attributes[ENTRY_CLASS]

            query = "select c ${clazz} c "
        }

        //TODO Paginação

        //TODO Ordenação

        //TODO Filtros

        if(attributes[ENTRY_QUERY] || attributes[ENTRY_CLASS]){
            def sessionFactory = context.sessionFactory
            def session = sessionFactory.getCurrentSession()
            def createdQuery = session.createQuery(query)
            result = query.list()
        }

        return result
    }

    /*
     * Retorna uma lista com todas as colunas, na ordem que aparecem na tela.
     * Retorna null se não houverem colunas neste grid.
     */
    private def getCols(def body){

        def colsObject
        def returnValue

        if(body.call().trim()){
            colsObject = body.call()
            def colsObjectTemp = "["+colsObject.trim()[0..-2]+"]"
            colsObjectTemp = colsObjectTemp.replace("{","[")
            colsObjectTemp = colsObjectTemp.replace("}","]")

            returnValue = Eval.me(colsObjectTemp)
        }

        return returnValue
    }

    /**
     * Renderizando as tags de colunas
     * Utilizado JSON para manter as aspas na conversão para lista e "," para gerar a lista
     */
    def col = {attributes, body ->
        out << ""+(attributes as JSON)+","
    }

    /**
     * Renderiza o tipo de filtro de acordo com o tipo do dado
     */
    def renderFilter = { attributes ->

        def type = attributes.type
        
        if(type == TYPE_DATE){

        }else if(type == TYPE_INTEGER){

        }else if(type == TYPE_DECIMAL){

        }else if(type == TYPE_TEXT){

        }else if(type == TYPE_BOOLEAN){

        }

    }

    /**
     * Renderiza a propriedade de acordo com seu tipo
     */
    def renderProperty = { attributes ->

    }
}

